package vip.liux.contracts.security.sms;


import java.time.Duration;
import java.time.Instant;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MapCaptchaCache implements CaptchaCache {
    private final Map<String, CaptchaEntry> cache = new ConcurrentHashMap<>();
    private final Map<String, Integer> errorCounts = new ConcurrentHashMap<>();

    /**
     * 将验证码放入缓存，并设置过期时间。
     *
     * @param phone  与验证码关联的电话号码
     * @param code   验证码
     * @param expire 验证码的过期时间
     */
    @Override
    public void putCodeInCache(String phone, String code, Duration expire) {
        Instant expiryTime = Instant.now().plus(expire);
        cache.put(phone, new CaptchaEntry(code, expiryTime));

    }

    /**
     * 从缓存中获取指定电话号码的验证码。
     *
     * @param phone 与验证码关联的电话号码
     * @return 包含验证码及其元数据的映射，如果未找到或已过期则返回 null
     */
    @Override
    public Map<String, String> getCodeFromCache(String phone) {
        CaptchaEntry entry = cache.get(phone);
        if (entry == null || entry.isExpired()) {
            return null;
        }
        return Map.of("code", entry.code());

    }

    /**
     * 增加指定电话号码的错误次数。
     *
     * @param phone 与验证码关联的电话号码
     */
    @Override
    public void errorTimesIncrement(String phone) {
        errorCounts.merge(phone, 1, Integer::sum);
    }

    /**
     * 从缓存中移除指定电话号码的验证码。
     *
     * @param phone 与验证码关联的电话号码
     */
    @Override
    public void removeCodeFromCache(String phone) {
        cache.remove(phone);
    }

    private record CaptchaEntry(String code, Instant expiryTime) {
        boolean isExpired() {
            return Instant.now().isAfter(expiryTime);
        }
    }
}
